/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.django.launching;
import java.io.File;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.python.pydev.core.IInterpreterManager;
import org.python.pydev.core.MisconfigurationException;
import org.python.pydev.core.PythonNatureWithoutProjectException;
import org.python.pydev.debug.core.Constants;
import org.python.pydev.debug.core.PydevDebugPlugin;
import org.python.pydev.plugin.nature.PythonNature;
/**
* Used to *programatically* run a python file located inside a project
* (as opposed than throught the UI shourtcuts mechanism).
*
* Automatically sets the right environment to run the script and
* shows the output on a console.
*
* Motivating use case: Django projects and their manage.py script.
*
* @author Leo Soto
*/
public class PythonFileRunner {
public static ILaunch launch(IFile file, String arguments) throws CoreException {
try {
ILaunchConfiguration conf = getLaunchConfiguration(file, arguments);
return conf.launch(ILaunchManager.RUN_MODE, null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static ILaunchConfigurationWorkingCopy getLaunchConfiguration(IFile resource, String programArguments)
throws CoreException, MisconfigurationException, PythonNatureWithoutProjectException {
String vmargs = ""; // Not sure if it should be a parameter or not
IProject project = resource.getProject();
PythonNature nature = PythonNature.getPythonNature(project);
ILaunchManager manager = org.eclipse.debug.core.DebugPlugin.getDefault().getLaunchManager();
String launchConfigurationType = configurationFor(nature.getInterpreterType());
ILaunchConfigurationType type = manager.getLaunchConfigurationType(launchConfigurationType);
if (type == null) {
throw new CoreException(PydevDebugPlugin.makeStatus(IStatus.ERROR, "Python launch configuration not found",
null));
}
String location = resource.getRawLocation().toString();
String name = manager.generateUniqueLaunchConfigurationNameFrom(resource.getName());
String baseDirectory = new File(location).getParent();
int resourceType = IResource.FILE;
ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, name);
// Python Main Tab Arguments
workingCopy.setAttribute(Constants.ATTR_PROJECT, project.getName());
workingCopy.setAttribute(Constants.ATTR_RESOURCE_TYPE, resourceType);
workingCopy.setAttribute(Constants.ATTR_INTERPRETER, nature.getProjectInterpreter().getExecutableOrJar());
workingCopy.setAttribute(Constants.ATTR_LOCATION, location);
workingCopy.setAttribute(Constants.ATTR_WORKING_DIRECTORY, baseDirectory);
workingCopy.setAttribute(Constants.ATTR_PROGRAM_ARGUMENTS, programArguments);
workingCopy.setAttribute(Constants.ATTR_VM_ARGUMENTS, vmargs);
workingCopy.setAttribute(IDebugUIConstants.ATTR_LAUNCH_IN_BACKGROUND, true);
workingCopy.setAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, true);
workingCopy.setMappedResources(new IResource[] { resource });
return workingCopy;
}
private static String configurationFor(int interpreterType) {
switch (interpreterType) {
case IInterpreterManager.INTERPRETER_TYPE_IRONPYTHON:
return Constants.ID_IRONPYTHON_LAUNCH_CONFIGURATION_TYPE;
case IInterpreterManager.INTERPRETER_TYPE_JYTHON:
return Constants.ID_JYTHON_LAUNCH_CONFIGURATION_TYPE;
case IInterpreterManager.INTERPRETER_TYPE_PYTHON:
return Constants.ID_PYTHON_REGULAR_LAUNCH_CONFIGURATION_TYPE;
default:
throw new RuntimeException("Unknown Python interpreter type");
}
}
}